package yxxy.c_007;

import java.util.concurrent.TimeUnit;

/**
 * 同步方法和非同步方法是否可以同时调用？
 * 答：肯定可以
 * 一个对象内同时有同步方法和非同步方法
 */
public class T {

    public synchronized void m1() {
        System.out.println(Thread.currentThread().getName() + " m1 start");
        try {
            TimeUnit.SECONDS.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName() + " m1 end");
    }

    public void m2() {
        System.out.println(Thread.currentThread().getName() + " m2 start");
        try {
            //线程休眠的一种写法，单位秒
            TimeUnit.SECONDS.sleep(5);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName() + " m2 end");
    }

    public synchronized void m3() {
        System.out.println(Thread.currentThread().getName() + " m3 start");
        System.out.println(Thread.currentThread().getName() + " m3 end");
    }

    public static void main(String[] args) {
        T t = new T();
        /*new Thread(t::m1).start();
        new Thread(t::m2).start();*/

        //使用lambada表达式的写法，把一个对象内的方法在runnable接口的run()方法中执行
        new Thread(() -> t.m1(), "t1").start();
        new Thread(() -> t.m2(), "t2").start();
        new Thread(() -> t.m3(), "t3").start(); //如果一个对象内有多个同步方法，在同时调用时也会按顺序来同步执行
    }
}
